Tumor evolution project

Data used

In this notebook, we are using the tmb_genomic.tsv file generated from the 01-preprocess-data.Rmd script.

Set up

suppressPackageStartupMessages({
  library(tidyverse)
})

Directories and File Inputs/Outputs

# Detect the ".git" folder. This will be in the project root directory.
# Use this as the root directory to ensure proper sourcing of functions
# no matter where this is called from.
root_dir <- rprojroot::find_root(rprojroot::has_dir(".git"))
scratch_dir <- file.path(root_dir, "scratch")
analysis_dir <- file.path(root_dir, "analyses", "tmb-vaf-longitudinal") 
input_dir <- file.path(analysis_dir, "input")

# Input files
tmb_genomic_file <- file.path(scratch_dir, "tmb_genomic.tsv")
tumor_descriptor_color_palette_file <- file.path(root_dir, "figures", "palettes", "tumor_descriptor_color_palette.tsv")

# File path to plots directory
plots_dir <-
  file.path(analysis_dir, "plots")
if (!dir.exists(plots_dir)) {
  dir.create(plots_dir)
}

source(paste0(analysis_dir, "/util/function-create-barplot.R"))
source(paste0(root_dir, "/figures/theme.R"))

Read in data and process

# Read tmb_genomic file generated from step `01-process-data.Rmd`
tmb_genomic <- readr::read_tsv(tmb_genomic_file, guess_max = 100000, show_col_types = FALSE)
tumor_descriptor_color_palette <- readr::read_tsv(tumor_descriptor_color_palette_file, guess_max = 100000, show_col_types = FALSE)

Create stacked barplots per Kids_First_Participant_ID

# Define parameters for function
ylim <- 13000
tmb <- tmb_genomic

# Run function
fname <- paste0(plots_dir, "/", "Stacked-barplot-tmb-genomic.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Stacked-barplot-tmb-genomic.pdf"
p <- create_stacked_barplot(tmb = tmb, ylim = ylim)
pdf(file = fname, width = 18, height = 8)
print(p)
dev.off()
quartz_off_screen 
                2 

We will exclude any samples with more than 1,000 mutations (hypermutant samples) for all of their tumor_descriptor from further analysis in this notebook. There are patient cases with high number of mutations in one timepoint. This m ight result to single timepoints per patient so we will also remove those.

# Filter df
tmb_genomic_filter <- tmb_genomic %>%
  filter(!mutation_count >= 1000)  %>%
  unique() %>% 
  arrange(Kids_First_Participant_ID, tumor_descriptor) %>%
  group_by(Kids_First_Participant_ID) %>%
  summarise(tumor_descriptor_sum = str_c(tumor_descriptor, collapse = ";")) %>% 
  filter(!tumor_descriptor_sum %in% c("Diagnosis", "Progressive", "Recurrence")) %>% 
  left_join(tmb_genomic, by = c("Kids_First_Participant_ID", "tumor_descriptor_sum")) %>% 
  mutate(cancer_group_sum = ifelse(cancer_group == "High-grade glioma", "High-grade glioma",
                                      ifelse(cancer_group == "Low-grade glioma", "Low-grade glioma", "Other")),
         cancer_group_sum = replace_na(cancer_group_sum, "Other"))

# Define parameters for function
ylim <- 450
tmb <- tmb_genomic_filter

# Run function
fname_exclude <- paste0(plots_dir, "/", "Stacked-barplot-tmb-genomic-filter.pdf")
print(fname_exclude)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Stacked-barplot-tmb-genomic-filter.pdf"
p <- create_stacked_barplot(tmb = tmb, ylim = ylim)
pdf(file = fname_exclude, width = 15, height = 8)
print(p)
dev.off()
quartz_off_screen 
                2 

Create stacked barplots per Kids_First_Participant_ID and broad_histology

# Define parameters for function
ylim <- 450
tmb <- tmb_genomic_filter

# Run function
fname <- paste0(plots_dir, "/", "Stacked-barplot-tmb-genomic-filter-broad-histology.pdf")
print(fname)
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/Stacked-barplot-tmb-genomic-filter-broad-histology.pdf"
p <- create_stacked_barplot_broad_histology(tmb = tmb, ylim = ylim)
pdf(file = fname, width = 15, height = 10)
print(p)
dev.off()
quartz_off_screen 
                2 

Create stacked barplots per Kids_First_Participant_ID and cancer_group_sum

We will create one graph for the major two cancer types (High-and Low-grade gliomas) and any other cancer type present.

cancer_types <- unique(as.character(tmb_genomic_filter$cancer_group_sum))
print(cancer_types)

for (i in seq_along(cancer_types)) {
  print(i)
  tmb_genomic_filter_sub <- tmb_genomic_filter %>%
    filter(cancer_group_sum == cancer_types [i])

  # Define parameters for function
  ylim <- 450

  # Run function
  fname <- paste0(plots_dir, "/", cancer_types[i], "-", "Stacked-barplot-tmb-genomic-filter.pdf")
  print(fname)
  p <- create_stacked_barplot_cancer_group_sum(tmb = tmb_genomic_filter_sub, ylim = ylim, ct_id = cancer_types[i])
  pdf(file = fname, width = 15, height = 10)
  print(p)
  dev.off()
}

Create stacked-barplots per Kids_First_Participant_ID and Kids_First_Biospecimen_ID

We have multiple Kids_First_Biospecimen_ID per tumor_descriptor and Kids_First_Participant_ID, so let’s plot these separately.

samples <- unique(as.character(tmb_genomic_filter$Kids_First_Participant_ID))
print(samples)
 [1] "PT_00G007DM" "PT_02J5CWN5" "PT_1H2REHT2" "PT_1ZAWNGWT" "PT_25Z2NX27" "PT_2ECVKTTQ" "PT_2FVTD0WR" "PT_2YT37G8P" "PT_37B5JRP1"
[10] "PT_3R0P995B" "PT_3T3VGWC6" "PT_3VCS1PPF" "PT_7M2PGCBV" "PT_82MX6J77" "PT_89XRZBSG" "PT_8GN3TQRM" "PT_962TCBVR" "PT_98QMQZY7"
[19] "PT_99S5BPE3" "PT_9PJR0ZK7" "PT_9S6WMQ92" "PT_AQWDQW27" "PT_CXT81GRM" "PT_DFQAH7RS" "PT_ESHACWF6" "PT_FN4GEEFR" "PT_HFQNKP5X"
[28] "PT_HJMP6PH2" "PT_JNEV57VK" "PT_JP1FDKN9" "PT_JSFBMK5V" "PT_K8ZV7APT" "PT_KBFM551M" "PT_KMHGNCNR" "PT_KTRJ8TFY" "PT_KZ56XHJT"
[37] "PT_MDWPRDBT" "PT_MNSEJCDM" "PT_N8W26H19" "PT_NK8A49X5" "PT_NPETR8RY" "PT_PFA762TK" "PT_PR4YBBH3" "PT_QH9H491G" "PT_RJ1TJ2KH"
[46] "PT_S2SQJVGK" "PT_S4YNE17X" "PT_T2M1338J" "PT_TKWTTRQ7" "PT_W6AWJJK7" "PT_WP871F5S" "PT_XA98HG1C" "PT_XHYBZKCX" "PT_XTVQB9S4"
[55] "PT_YGN06RPZ" "PT_Z4GS3ZQQ" "PT_ZMKMKCFQ" "PT_ZZRBX5JT"
for (i in seq_along(samples)) {
  print(i)
  tmb_sub <- tmb_genomic_filter %>%
    filter(Kids_First_Participant_ID == samples[i])
  # Define parameters for function
  ylim <- 450
  
  # Run function
  fname <- paste0(plots_dir, "/", samples[i], "-TMB-barplot.pdf")
  print(fname)
  p <- create_barplot_sample(tmb = tmb_sub,
                             sid = samples[i],
                             ylim = ylim)
  pdf(file = fname, width = 5, height = 4)
  print(p)
  dev.off()
}
[1] 1
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_00G007DM-TMB-barplot.pdf"
[1] 2
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_02J5CWN5-TMB-barplot.pdf"
[1] 3
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1H2REHT2-TMB-barplot.pdf"
[1] 4
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_1ZAWNGWT-TMB-barplot.pdf"
[1] 5
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_25Z2NX27-TMB-barplot.pdf"
[1] 6
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2ECVKTTQ-TMB-barplot.pdf"
[1] 7
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2FVTD0WR-TMB-barplot.pdf"
[1] 8
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_2YT37G8P-TMB-barplot.pdf"
[1] 9
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_37B5JRP1-TMB-barplot.pdf"
[1] 10
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3R0P995B-TMB-barplot.pdf"
[1] 11
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3T3VGWC6-TMB-barplot.pdf"
[1] 12
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_3VCS1PPF-TMB-barplot.pdf"
[1] 13
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_7M2PGCBV-TMB-barplot.pdf"
[1] 14
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_82MX6J77-TMB-barplot.pdf"
[1] 15
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_89XRZBSG-TMB-barplot.pdf"
[1] 16
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_8GN3TQRM-TMB-barplot.pdf"
[1] 17
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_962TCBVR-TMB-barplot.pdf"
[1] 18
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_98QMQZY7-TMB-barplot.pdf"
[1] 19
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_99S5BPE3-TMB-barplot.pdf"
[1] 20
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9PJR0ZK7-TMB-barplot.pdf"
[1] 21
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_9S6WMQ92-TMB-barplot.pdf"
[1] 22
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_AQWDQW27-TMB-barplot.pdf"
[1] 23
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_CXT81GRM-TMB-barplot.pdf"
[1] 24
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_DFQAH7RS-TMB-barplot.pdf"
[1] 25
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ESHACWF6-TMB-barplot.pdf"
[1] 26
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_FN4GEEFR-TMB-barplot.pdf"
[1] 27
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HFQNKP5X-TMB-barplot.pdf"
[1] 28
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_HJMP6PH2-TMB-barplot.pdf"
[1] 29
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JNEV57VK-TMB-barplot.pdf"
[1] 30
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JP1FDKN9-TMB-barplot.pdf"
[1] 31
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_JSFBMK5V-TMB-barplot.pdf"
[1] 32
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_K8ZV7APT-TMB-barplot.pdf"
[1] 33
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KBFM551M-TMB-barplot.pdf"
[1] 34
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KMHGNCNR-TMB-barplot.pdf"
[1] 35
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KTRJ8TFY-TMB-barplot.pdf"
[1] 36
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_KZ56XHJT-TMB-barplot.pdf"
[1] 37
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MDWPRDBT-TMB-barplot.pdf"
[1] 38
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_MNSEJCDM-TMB-barplot.pdf"
[1] 39
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_N8W26H19-TMB-barplot.pdf"
[1] 40
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_NK8A49X5-TMB-barplot.pdf"
[1] 41
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_NPETR8RY-TMB-barplot.pdf"
[1] 42
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PFA762TK-TMB-barplot.pdf"
[1] 43
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_PR4YBBH3-TMB-barplot.pdf"
[1] 44
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_QH9H491G-TMB-barplot.pdf"
[1] 45
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_RJ1TJ2KH-TMB-barplot.pdf"
[1] 46
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S2SQJVGK-TMB-barplot.pdf"
[1] 47
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_S4YNE17X-TMB-barplot.pdf"
[1] 48
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_T2M1338J-TMB-barplot.pdf"
[1] 49
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_TKWTTRQ7-TMB-barplot.pdf"
[1] 50
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_W6AWJJK7-TMB-barplot.pdf"
[1] 51
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_WP871F5S-TMB-barplot.pdf"
[1] 52
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XA98HG1C-TMB-barplot.pdf"
[1] 53
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XHYBZKCX-TMB-barplot.pdf"
[1] 54
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_XTVQB9S4-TMB-barplot.pdf"
[1] 55
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_YGN06RPZ-TMB-barplot.pdf"
[1] 56
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_Z4GS3ZQQ-TMB-barplot.pdf"
[1] 57
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZMKMKCFQ-TMB-barplot.pdf"
[1] 58
[1] "/Users/chronia/CHOP/GitHub/pbta-tumor-evolution/analyses/tmb-vaf-longitudinal/plots/PT_ZZRBX5JT-TMB-barplot.pdf"

sessionInfo()
R version 4.2.3 (2023-03-15)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.4.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2-arm64/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] ggthemes_4.2.4  lubridate_1.9.2 forcats_1.0.0   stringr_1.5.0   dplyr_1.1.2     purrr_1.0.1     readr_2.1.4     tidyr_1.3.0    
 [9] tibble_3.2.1    ggplot2_3.4.2   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] bslib_0.5.0       jquerylib_0.1.4   pillar_1.9.0      compiler_4.2.3    tools_4.2.3       bit_4.0.5         digest_0.6.33    
 [8] jsonlite_1.8.7    timechange_0.2.0  evaluate_0.21     lifecycle_1.0.3   gtable_0.3.3      pkgconfig_2.0.3   rlang_1.1.1      
[15] cli_3.6.1         rstudioapi_0.15.0 parallel_4.2.3    yaml_2.3.7        xfun_0.39         fastmap_1.1.1     withr_2.5.0      
[22] knitr_1.43        sass_0.4.7        generics_0.1.3    vctrs_0.6.3       hms_1.1.3         bit64_4.0.5       rprojroot_2.0.3  
[29] tidyselect_1.2.0  glue_1.6.2        R6_2.5.1          fansi_1.0.4       vroom_1.6.3       rmarkdown_2.23    farver_2.1.1     
[36] tzdb_0.4.0        magrittr_2.0.3    scales_1.2.1      htmltools_0.5.5   colorspace_2.1-0  labeling_0.4.2    utf8_1.2.3       
[43] stringi_1.7.12    munsell_0.5.0     cachem_1.0.8      crayon_1.5.2     
LS0tCnRpdGxlOiAiQ3JlYXRlIFRNQiBiYXJwbG90cyBvZiB0dW1vcnMgYWNyb3NzIG11bHRpcGxlIHRpbWVwb2ludHMgZm9yIHRociBhdXRvcHN5IHNhbXBsZXMgaW4gdGhlIFBCVEEgQ29ob3J0IgphdXRob3I6ICJBbnRvbmlhIENocm9uaSA8Y2hyb25pYUBjaG9wLmVkdT4gZm9yIEQzQiIKZGF0ZTogIjIwMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgojIyMjIFR1bW9yIGV2b2x1dGlvbiBwcm9qZWN0IAoKIyMjIERhdGEgdXNlZCAKSW4gdGhpcyBub3RlYm9vaywgd2UgYXJlIHVzaW5nIHRoZSBgdG1iX2dlbm9taWMudHN2YCBmaWxlIGdlbmVyYXRlZCBmcm9tIHRoZSBgMDEtcHJlcHJvY2Vzcy1kYXRhLlJtZGAgc2NyaXB0LgoKIyBTZXQgdXAKYGBge3IgbG9hZC1saWJyYXJ5fQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoewogIGxpYnJhcnkodGlkeXZlcnNlKQp9KQpgYGAKCiMgRGlyZWN0b3JpZXMgYW5kIEZpbGUgSW5wdXRzL091dHB1dHMKYGBge3Igc2V0LWRpci1hbmQtZmlsZS1uYW1lc30KIyBEZXRlY3QgdGhlICIuZ2l0IiBmb2xkZXIuIFRoaXMgd2lsbCBiZSBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KIyBVc2UgdGhpcyBhcyB0aGUgcm9vdCBkaXJlY3RvcnkgdG8gZW5zdXJlIHByb3BlciBzb3VyY2luZyBvZiBmdW5jdGlvbnMKIyBubyBtYXR0ZXIgd2hlcmUgdGhpcyBpcyBjYWxsZWQgZnJvbS4Kcm9vdF9kaXIgPC0gcnByb2pyb290OjpmaW5kX3Jvb3QocnByb2pyb290OjpoYXNfZGlyKCIuZ2l0IikpCnNjcmF0Y2hfZGlyIDwtIGZpbGUucGF0aChyb290X2RpciwgInNjcmF0Y2giKQphbmFseXNpc19kaXIgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiYW5hbHlzZXMiLCAidG1iLXZhZi1sb25naXR1ZGluYWwiKSAKaW5wdXRfZGlyIDwtIGZpbGUucGF0aChhbmFseXNpc19kaXIsICJpbnB1dCIpCgojIElucHV0IGZpbGVzCnRtYl9nZW5vbWljX2ZpbGUgPC0gZmlsZS5wYXRoKHNjcmF0Y2hfZGlyLCAidG1iX2dlbm9taWMudHN2IikKdHVtb3JfZGVzY3JpcHRvcl9jb2xvcl9wYWxldHRlX2ZpbGUgPC0gZmlsZS5wYXRoKHJvb3RfZGlyLCAiZmlndXJlcyIsICJwYWxldHRlcyIsICJ0dW1vcl9kZXNjcmlwdG9yX2NvbG9yX3BhbGV0dGUudHN2IikKCiMgRmlsZSBwYXRoIHRvIHBsb3RzIGRpcmVjdG9yeQpwbG90c19kaXIgPC0KICBmaWxlLnBhdGgoYW5hbHlzaXNfZGlyLCAicGxvdHMiKQppZiAoIWRpci5leGlzdHMocGxvdHNfZGlyKSkgewogIGRpci5jcmVhdGUocGxvdHNfZGlyKQp9Cgpzb3VyY2UocGFzdGUwKGFuYWx5c2lzX2RpciwgIi91dGlsL2Z1bmN0aW9uLWNyZWF0ZS1iYXJwbG90LlIiKSkKc291cmNlKHBhc3RlMChyb290X2RpciwgIi9maWd1cmVzL3RoZW1lLlIiKSkKYGBgCgojIFJlYWQgaW4gZGF0YSBhbmQgcHJvY2VzcwpgYGB7ciByZWFkX2lucHV0X2ZpbGVzfQojIFJlYWQgdG1iX2dlbm9taWMgZmlsZSBnZW5lcmF0ZWQgZnJvbSBzdGVwIGAwMS1wcm9jZXNzLWRhdGEuUm1kYAp0bWJfZ2Vub21pYyA8LSByZWFkcjo6cmVhZF90c3YodG1iX2dlbm9taWNfZmlsZSwgZ3Vlc3NfbWF4ID0gMTAwMDAwLCBzaG93X2NvbF90eXBlcyA9IEZBTFNFKQp0dW1vcl9kZXNjcmlwdG9yX2NvbG9yX3BhbGV0dGUgPC0gcmVhZHI6OnJlYWRfdHN2KHR1bW9yX2Rlc2NyaXB0b3JfY29sb3JfcGFsZXR0ZV9maWxlLCBndWVzc19tYXggPSAxMDAwMDAsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCgpgYGAKCiMgQ3JlYXRlIHN0YWNrZWQgYmFycGxvdHMgcGVyIGBLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEYApgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90fQojIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgp5bGltIDwtIDEzMDAwCnRtYiA8LSB0bWJfZ2Vub21pYwoKIyBSdW4gZnVuY3Rpb24KZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCAiU3RhY2tlZC1iYXJwbG90LXRtYi1nZW5vbWljLnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3QodG1iID0gdG1iLCB5bGltID0geWxpbSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxOCwgaGVpZ2h0ID0gOCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKV2Ugd2lsbCBleGNsdWRlIGFueSBzYW1wbGVzIHdpdGggbW9yZSB0aGFuIDEsMDAwIG11dGF0aW9ucyAoaHlwZXJtdXRhbnQgc2FtcGxlcykgZm9yIGFsbCBvZiB0aGVpciBgdHVtb3JfZGVzY3JpcHRvcmAgZnJvbSBmdXJ0aGVyIGFuYWx5c2lzIGluIHRoaXMgbm90ZWJvb2suIFRoZXJlIGFyZSBwYXRpZW50IGNhc2VzIHdpdGggaGlnaCBudW1iZXIgb2YgbXV0YXRpb25zIGluIG9uZSB0aW1lcG9pbnQuIFRoaXMgbSBpZ2h0IHJlc3VsdCB0byBzaW5nbGUgdGltZXBvaW50cyBwZXIgcGF0aWVudCBzbyB3ZSB3aWxsIGFsc28gcmVtb3ZlIHRob3NlLgoKYGBge3IgY3JlYXRlLXN0YWNrZWQtYmFycGxvdC1maWx0ZXJ9CiMgRmlsdGVyIGRmCnRtYl9nZW5vbWljX2ZpbHRlciA8LSB0bWJfZ2Vub21pYyAlPiUKICBmaWx0ZXIoIW11dGF0aW9uX2NvdW50ID49IDEwMDApICAlPiUKICB1bmlxdWUoKSAlPiUgCiAgYXJyYW5nZShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lELCB0dW1vcl9kZXNjcmlwdG9yKSAlPiUKICBncm91cF9ieShLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSAlPiUKICBzdW1tYXJpc2UodHVtb3JfZGVzY3JpcHRvcl9zdW0gPSBzdHJfYyh0dW1vcl9kZXNjcmlwdG9yLCBjb2xsYXBzZSA9ICI7IikpICU+JSAKICBmaWx0ZXIoIXR1bW9yX2Rlc2NyaXB0b3Jfc3VtICVpbiUgYygiRGlhZ25vc2lzIiwgIlByb2dyZXNzaXZlIiwgIlJlY3VycmVuY2UiKSkgJT4lIAogIGxlZnRfam9pbih0bWJfZ2Vub21pYywgYnkgPSBjKCJLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEIiwgInR1bW9yX2Rlc2NyaXB0b3Jfc3VtIikpICU+JSAKICBtdXRhdGUoY2FuY2VyX2dyb3VwX3N1bSA9IGlmZWxzZShjYW5jZXJfZ3JvdXAgPT0gIkhpZ2gtZ3JhZGUgZ2xpb21hIiwgIkhpZ2gtZ3JhZGUgZ2xpb21hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY2FuY2VyX2dyb3VwID09ICJMb3ctZ3JhZGUgZ2xpb21hIiwgIkxvdy1ncmFkZSBnbGlvbWEiLCAiT3RoZXIiKSksCiAgICAgICAgIGNhbmNlcl9ncm91cF9zdW0gPSByZXBsYWNlX25hKGNhbmNlcl9ncm91cF9zdW0sICJPdGhlciIpKQoKIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KeWxpbSA8LSA0NTAKdG1iIDwtIHRtYl9nZW5vbWljX2ZpbHRlcgoKIyBSdW4gZnVuY3Rpb24KZm5hbWUgPC0gcGFzdGUwKHBsb3RzX2RpciwgIi8iLCAiU3RhY2tlZC1iYXJwbG90LXRtYi1nZW5vbWljLWZpbHRlci5wZGYiKQpwcmludChmbmFtZV9leGNsdWRlKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3QodG1iID0gdG1iLCB5bGltID0geWxpbSkKcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSAxNSwgaGVpZ2h0ID0gOCkKcHJpbnQocCkKZGV2Lm9mZigpCmBgYAoKIyBDcmVhdGUgc3RhY2tlZCBiYXJwbG90cyBwZXIgYEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSURgIGFuZCBgYnJvYWRfaGlzdG9sb2d5YApgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90LWZpbHRlci1icm9hZC1oaXN0b2xvZ3l9CiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uCnlsaW0gPC0gNDUwCnRtYiA8LSB0bWJfZ2Vub21pY19maWx0ZXIKCiMgUnVuIGZ1bmN0aW9uCmZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgIlN0YWNrZWQtYmFycGxvdC10bWItZ2Vub21pYy1maWx0ZXItYnJvYWQtaGlzdG9sb2d5LnBkZiIpCnByaW50KGZuYW1lKQpwIDwtIGNyZWF0ZV9zdGFja2VkX2JhcnBsb3RfYnJvYWRfaGlzdG9sb2d5KHRtYiA9IHRtYiwgeWxpbSA9IHlsaW0pCnBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTUsIGhlaWdodCA9IDEwKQpwcmludChwKQpkZXYub2ZmKCkKYGBgCgojIENyZWF0ZSBzdGFja2VkIGJhcnBsb3RzIHBlciBgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRGAgYW5kIGBjYW5jZXJfZ3JvdXBfc3VtYApXZSB3aWxsIGNyZWF0ZSBvbmUgZ3JhcGggZm9yIHRoZSBtYWpvciB0d28gY2FuY2VyIHR5cGVzIChIaWdoLWFuZCBMb3ctZ3JhZGUgZ2xpb21hcykgYW5kIGFueSBvdGhlciBjYW5jZXIgdHlwZSBwcmVzZW50LgoKYGBge3IgY3JlYXRlLXN0YWNrZWQtYmFycGxvdC1maWx0ZXItY2FuY2VyLWdyb3VwLXN1bX0KY2FuY2VyX3R5cGVzIDwtIHVuaXF1ZShhcy5jaGFyYWN0ZXIodG1iX2dlbm9taWNfZmlsdGVyJGNhbmNlcl9ncm91cF9zdW0pKQpwcmludChjYW5jZXJfdHlwZXMpCgpmb3IgKGkgaW4gc2VxX2Fsb25nKGNhbmNlcl90eXBlcykpIHsKICBwcmludChpKQogIHRtYl9nZW5vbWljX2ZpbHRlcl9zdWIgPC0gdG1iX2dlbm9taWNfZmlsdGVyICU+JQogICAgZmlsdGVyKGNhbmNlcl9ncm91cF9zdW0gPT0gY2FuY2VyX3R5cGVzIFtpXSkKCiAgIyBEZWZpbmUgcGFyYW1ldGVycyBmb3IgZnVuY3Rpb24KICB5bGltIDwtIDQ1MAoKICAjIFJ1biBmdW5jdGlvbgogIGZuYW1lIDwtIHBhc3RlMChwbG90c19kaXIsICIvIiwgY2FuY2VyX3R5cGVzW2ldLCAiLSIsICJTdGFja2VkLWJhcnBsb3QtdG1iLWdlbm9taWMtZmlsdGVyLnBkZiIpCiAgcHJpbnQoZm5hbWUpCiAgcCA8LSBjcmVhdGVfc3RhY2tlZF9iYXJwbG90X2NhbmNlcl9ncm91cF9zdW0odG1iID0gdG1iX2dlbm9taWNfZmlsdGVyX3N1YiwgeWxpbSA9IHlsaW0sIGN0X2lkID0gY2FuY2VyX3R5cGVzW2ldKQogIHBkZihmaWxlID0gZm5hbWUsIHdpZHRoID0gMTUsIGhlaWdodCA9IDEwKQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KYGBgCgojIENyZWF0ZSBzdGFja2VkLWJhcnBsb3RzIHBlciBgS2lkc19GaXJzdF9QYXJ0aWNpcGFudF9JRGAgYW5kIGBLaWRzX0ZpcnN0X0Jpb3NwZWNpbWVuX0lEYAoKV2UgaGF2ZSBtdWx0aXBsZSBgS2lkc19GaXJzdF9CaW9zcGVjaW1lbl9JRGAgcGVyIGB0dW1vcl9kZXNjcmlwdG9yYCBhbmQgYEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSURgLCBzbyBsZXQncyBwbG90IHRoZXNlIHNlcGFyYXRlbHkuCgpgYGB7ciBjcmVhdGUtc3RhY2tlZC1iYXJwbG90LXNhbXBsZX0Kc2FtcGxlcyA8LSB1bmlxdWUoYXMuY2hhcmFjdGVyKHRtYl9nZW5vbWljX2ZpbHRlciRLaWRzX0ZpcnN0X1BhcnRpY2lwYW50X0lEKSkKcHJpbnQoc2FtcGxlcykKCmZvciAoaSBpbiBzZXFfYWxvbmcoc2FtcGxlcykpIHsKICBwcmludChpKQogIHRtYl9zdWIgPC0gdG1iX2dlbm9taWNfZmlsdGVyICU+JQogICAgZmlsdGVyKEtpZHNfRmlyc3RfUGFydGljaXBhbnRfSUQgPT0gc2FtcGxlc1tpXSkKICAKICAjIERlZmluZSBwYXJhbWV0ZXJzIGZvciBmdW5jdGlvbgogIHlsaW0gPC0gNDUwCiAgCiAgIyBSdW4gZnVuY3Rpb24KICBmbmFtZSA8LSBwYXN0ZTAocGxvdHNfZGlyLCAiLyIsIHNhbXBsZXNbaV0sICItVE1CLWJhcnBsb3QucGRmIikKICBwcmludChmbmFtZSkKICBwIDwtIGNyZWF0ZV9iYXJwbG90X3NhbXBsZSh0bWIgPSB0bWJfc3ViLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlsaW0gPSB5bGltLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZCA9IHNhbXBsZXNbaV0pCiAgcGRmKGZpbGUgPSBmbmFtZSwgd2lkdGggPSA1LCBoZWlnaHQgPSA0KQogIHByaW50KHApCiAgZGV2Lm9mZigpCn0KYGBgCgoKYGBge3IgZWNobz1UUlVFfQpzZXNzaW9uSW5mbygpCmBgYAo=